package com.bkhech.boot.sample.mvc.accesstoken.oauth2;

import cn.hutool.core.util.RandomUtil;
import com.bkhech.boot.sample.mvc.accesstoken.oauth2.dto.OAuth2AccessTokenCheckRespDto;
import com.bkhech.boot.sample.mvc.accesstoken.oauth2.dto.OAuth2AccessTokenCreateReqDto;
import com.bkhech.boot.sample.mvc.accesstoken.oauth2.dto.OAuth2AccessTokenRespDto;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * OAuth2.0 Token API 接口
 *
 * @author guowm
 * @date 2023/2/1
 */
public interface OAuth2TokenApi {

    Map<Long, OAuth2AccessTokenRespDto> accessTokenMap = getAccessTokenMap();

    static Map<Long, OAuth2AccessTokenRespDto> getAccessTokenMap() {
        final OAuth2AccessTokenRespDto respDto1 = new OAuth2AccessTokenRespDto();
        respDto1.setUserId(1L);
        respDto1.setExpiresTime(LocalDateTime.now().plusHours(1));
        respDto1.setAccessToken("g03zh6b7grzg");
        respDto1.setRefreshToken("gubxjexpbnb7");

        final OAuth2AccessTokenRespDto respDto2 = new OAuth2AccessTokenRespDto();
        respDto2.setUserId(2L);
        respDto2.setExpiresTime(LocalDateTime.now().plusHours(1));
        respDto2.setAccessToken(RandomUtil.randomString(12));
        respDto2.setRefreshToken(RandomUtil.randomString(12));

        return Map.ofEntries(
                Map.entry(1L, respDto1),
                Map.entry(2L, respDto2)
        );
    }

    /**
     * 创建访问令牌
     *
     * @param reqDto 访问令牌的创建信息
     * @return 访问令牌信息
     */
    OAuth2AccessTokenRespDto createAccessToken(@Valid OAuth2AccessTokenCreateReqDto reqDto);

    /**
     * 移除访问令牌
     *
     * @param accessToken 访问令牌
     * @return 访问令牌信息
     */
    OAuth2AccessTokenRespDto removeAccessToken(String accessToken);

    /**
     * 刷新访问令牌
     * @param refreshToken 刷新令牌
     * @param clientId 客户端编号
     * @return 访问令牌信息
     */
    OAuth2AccessTokenRespDto refreshAccessToken(String refreshToken, String clientId);

    /**
     * 校验访问令牌
     * @param accessToken 访问令牌
     * @return 访问令牌的信息
     */
    OAuth2AccessTokenCheckRespDto checkAccessToken(String accessToken);

}
